数据集介绍
训练数据来自INRIA Person Dataset,其中正样本为64*128的人体图像,负样本为64*128的非人体图像,如下图所示。
HOG特征
HOG特征详细介绍:HOG论文笔记提取HOG特征的方法使用了skimage库中的hog函数。
1 |
|
训练SVM
因为每张图片提取出来的HOG特征有6480维,所以我们使用线性SVM就足够可分。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30def train_svm():
pos_feat_path = '../data/features/pos'
neg_feat_path = '../data/features/neg'
# Classifiers supported
clf_type = 'LIN_SVM'
fds = []
labels = []
# Load the positive features
for feat_path in glob.glob(os.path.join(pos_feat_path,"*.feat")):
fd = joblib.load(feat_path)
fds.append(fd)
labels.append(1)
# Load the negative features
for feat_path in glob.glob(os.path.join(neg_feat_path,"*.feat")):
fd = joblib.load(feat_path)
fds.append(fd)
labels.append(0)
print np.array(fds).shape,len(labels)
if clf_type is "LIN_SVM":
clf = LinearSVC()
print "Training a Linear SVM Classifier"
clf.fit(fds, labels)
# If feature directories don't exist, create them
if not os.path.isdir(os.path.split(model_path)[0]):
os.makedirs(os.path.split(model_path)[0])
joblib.dump(clf, model_path)
print "Classifier saved to {}".format(model_path)
进行人体检测
因为对进行人体检测的输入图片大小是未知的,所以需要对图片进行尺度缩放,使用的方法如下所示:
1 | from skimage.transform import pyramid_gaussian |
在缩放的尺度上对图片进行滑动窗口检测,可能会在不同尺度上都检测到了目标,这样会造成标记的混乱,可以使用非极大值抑制的方法对重复标记的的目标经行剔除。可以从imutils包中导入非极大值抑制函数。
imutils包安装1
sudo pip install imutils
使用非极大值抑制函数:1
from imutils.object_detection import non_max_suppression
完整检测代码:
1 | def sliding_window(image, window_size, step_size): |
效果演示
非极大值抑制处理前:
非极大值抑制处理后:
github地址:object-detector